﻿#define _CRT_SECURE_NO_WARNINGS 1;

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdbool.h>

//数组名的理解
//数组名本质是数组首元素的地址
//示例代码：
//int main() {
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("arr = %p\n", arr);
//	printf("arr[0]的地址 = %p\n", &arr[0]);
//	return 0;
//}

//我们发现数组名的地址和数组首元素的地址一摸一样
//说明数组名的本质是数组首元素的地址

//示例代码：
//int main() {
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("%d", sizeof(arr));
//	return 0;
//}

//输出结果：40，如果数组名真的是数组首个元素的地址的话输出的应该是4或者8
//其实数组名就是数组⾸元素(第⼀个元素)的地址是对的，但是有两个例外：

//sizeof(数组名)，sizeof中单独放数组名，这⾥的数组名表⽰整个数组，计算的是整个数组的⼤⼩，
//单位是字节

//& 数组名，这⾥的数组名表⽰整个数组，取出的是整个数组的地址（整个数组的地址和数组⾸元素
//的地址是有区别的）
//除此之外，任何地⽅使⽤数组名，数组名都表⽰⾸元素的地址。

//int main() {
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("arr[0]的地址是%p\n", &arr[0]);
//	printf("arr的地址是%p\n", &arr);
//	printf("arr = %p\n", arr);
//	return 0;
//}

//arr和&arr的区别
//int main() {
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("&arr[0]   = %p\n", &arr[0]);
//	printf("&arr[0]+1 = %p\n", &arr[0] + 1);
//	printf("arr = % p\n", arr);
//	printf("arr+1 = %p\n", arr + 1);
//	printf("&arr = %p\n", &arr);
//	printf("&arr+1 = %p\n", &arr + 1);
//	return 0;
//}

//使用指针访问数组
//需求：利用指针变量初始化数组，并利用指针变量打印数组的内容
//
//int main() {
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* pi = arr;
//	int* tmp = pi;
//	for (int i = 0; i < sz; i++) {
//		assert((tmp + i) != NULL);
//		scanf("%d", tmp + i);
//	}
//	tmp = NULL;
//
//	//一条华丽的分割线
//	printf("-----------------------\n");
//	for (int i = 0; i < sz; i++) {
//		assert((pi + i) != NULL);
//		printf("%d\n", *(pi + i));
//	}
//	return 0;
//}

//一维数组传参的本质：一维数组进行传参的时候会弱化为指针进行传递
//示例代码：
//int test(int arr[]) {
//	assert(arr != NULL);
//	int size = sizeof(arr) / sizeof(arr[0]);
//	return size;
//}
//
//int main() {
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int size = sizeof(arr) / sizeof(arr[0]);
//	printf("%d\n", size);
//	size = test(arr);
//	printf("%d\n", size);
//	return 0;
//}

//冒泡排序
//算法思想：遍历整个数组，如果前后两个数为逆序则交换位置
void bublesort(int arr[], int size) {
	for (int i = 0; i < size; i++) {
		for (int j = size - 1; j > i; j--) {
			if (arr[j - 1] > arr[j]) {
				int tmp = arr[j - 1];
				arr[j - 1] = arr[j];
				arr[j] = tmp;
			}
		}
	}
}

void bublesort1(int arr[], int size) {
	//设置一个哨兵若一趟排序中没有发生对换，则跳过这一轮循环
	for (int i = 0; i < size; i++) {
		bool flag = false;
		for (int j = size - 1; j > i; j--) {
			if (arr[j - 1] > arr[j]) {
				int tmp = arr[j - 1];
				arr[j - 1] = arr[j];
				arr[j] = tmp;
				flag = true;
			}
			if (!flag) {
				break;
			}
		}
	}
}

int main() {
	int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
	int size = sizeof(arr) / sizeof(arr[0]);
	printf("排序前：\n");
	for (int i = 0; i < size; i++) {
		printf("%d ",arr[i]);
	}
	printf("\n");
	//bublesort(arr, size);
	bublesort(arr, size);
	printf("排序后：\n");
	for (int i = 0; i < size; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}